//把数字翻译成字符串
class Solution {
public:
    int translateNum(int num) 
    {
        //dp[i] 前i个字符能翻译成几种字符串
        //先想一下什么情况下当前字符可以和前一个字符组成两种合法的
        // 01 09  10  19 20 26 27
        //发现只有这两个字符组成数字范围在[10,25)时 可以看做
        //一个字符 或者分开看做两个字符

        //初始化
        //dp[0]=1?  dp[1]=1  
        //当数字为12时 dp[2]=dp[1]+dp[0]; -->dp[0]=1;
        string str=to_string(num);
        int n=str.size();
        vector<int>dp(n+1,0);
        dp[0]=1;dp[1]=1;
        for(int i=2;i<=n;i++)
        {
            int tmp=(str[i-2]-'0')*10+(str[i-1]-'0');
            if((tmp>=10 && tmp<26))
            {
                dp[i]=dp[i-1]+dp[i-2];
            }
            else
            {
                dp[i]=dp[i-1];
            }
        }
        return dp[n];
    }
};
//可获得的最大点数
class Solution {
public:
    int maxScore(vector<int>& cardPoints, int k) 
    {
        //由于每次都是从头或者尾拿走一张
        //那么剩下来的一定是连续的
        //如果不好求拿走的最大值 那就求剩下的最小值
        int n=cardPoints.size();
        int sum=0;
        for(auto e:cardPoints) sum+=e;
        int windsize=n-k;
        //将滑动窗口从0位置一直往后滑 保证窗口大小是windsize
        //滑到结束位置 记录过程中的所有值也就知道了最小值
        int remain=0;
        for(int i=0;i<windsize;i++)
        {
            remain+=cardPoints[i];
        }
        int minres=remain;
        //[0,1,2,..windsize-1],windsize,...,n-1
        for(int i=windsize;i<n;i++)
        {
            remain+=cardPoints[i]-cardPoints[i-windsize];
            minres=min(minres,remain);
        }
        return sum-minres;
    }
};